`:top
Ein `!Zwischencode`! – im weitesten Sinne auch `!Zwischensprache`! genannt – ist der `F33f`_`[Programmcode`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Programmcode]`_`f, der im Verlauf eines `F33f`_`[Übersetzungsprozesses`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Compiler]`_`f auf einer `F33f`_`[Abstraktionsebene`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Abstraktion]`_`f zwischen der höheren Ausgangs`F33f`_`[sprache`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Programmiersprache]`_`f und der in der Regel maschinennahen Zielsprache generiert wird. Es handelt sich in erster Linie um einen im `F33f`_`[Compilerbau`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Compilerbau]`_`f etablierten konzeptionellen Zwischenschritt, der nicht immer mit der Erzeugung von Produkten verbunden ist.
>>Contents
• `F0af`_`[Geschichte`#geschichte]`_`f
• `F0af`_`[Vorteile`#vorteile]`_`f
• `F0af`_`[Static Single Assignment`#static-single-assignment]`_`f
• `F0af`_`[Sprachen`#sprachen]`_`f
• `F0af`_`[Siehe auch`#siehe-auch]`_`f
-─
>>Geschichte
`F33f`_`[Martin Richards`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Martin_Richards_(Informatiker)]`_`f entwickelte in den späten 1960er Jahren für seine Programmiersprache `F33f`_`[BCPL`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Basic_Combined_Programming_Language]`_`f, den Vorläufer von `F33f`_`[C`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=C_(Programmiersprache)]`_`f und `F33f`_`[C++`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=C++]`_`f, einen Zwischencode namens O-Code (O für `F33f`_`[Objektcode`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Objektcode]`_`f), der den eigentlichen `F33f`_`[Compiler`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Compiler]`_`f maschinenunabhängig machte. Dies ermöglichte die leichte `F33f`_`[Portierung`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Portierung_(Software)]`_`f dieses Compilers auf unterschiedliche `F33f`_`[Prozessoren`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Prozessor]`_`f. Der O-Code konnte dann `F33f`_`[interpretiert`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Interpreter]`_`f oder in maschinenspezifischen Code übersetzt werden.
Die `F33f`_`[UCSD-Pascal`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=UCSD_Pascal]`_`f-Umgebungen aus den späten 1970er Jahren verwendeten `F33f`_`[p-Code`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=P-Code]`_`f. Der Versuch, vollständig `F33f`_`[portable`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Plattformunabhängigkeit]`_`f `F33f`_`[Computerprogramme`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Computerprogramm]`_`f auf Basis eines interpretierten `F33f`_`[Bytecodes`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Bytecode]`_`f zu ermöglichen, scheiterte jedoch weitgehend aufgrund der geringen Geschwindigkeit der damaligen `F33f`_`[Computersysteme`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Computer]`_`f – man konnte und wollte sich zu dieser Zeit Verlangsamung durch die zusätzliche Indirektion nicht leisten.
>>Vorteile
Es kann vorteilhaft sein, nicht direkt Code für den Prozessor des `F33f`_`[Laufzeitsystems`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Laufzeitsystem]`_`f zu erzeugen, sondern zunächst nur Zwischencode für einen idealen (bzw. virtuellen) Prozessor, der oft nur durch `F33f`_`[Software`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Software]`_`f simuliert wird. Gründe können u. a. sein:
• Portabilität bzw. Plattformunabhängigkeit (siehe auch `F33f`_`[Java VM`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Java_VM]`_`f)
• Vereinfachung des Übersetzungsprozesses (siehe auch `F33f`_`[p-Code`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=P-Code]`_`f),
• allgemeine Optimierungen (`F33f`_`[effizienz`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Effizienz_(Informatik)]`_`fsteigernde Codetransformationen) können bereits auf dem Zwischencode vorgenommen werden,
• der Zielprozessor ist noch nicht bequem genug zu programmieren, z. B. weil man gerne `F33f`_`[Gleitkommabefehle`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Gleitkommaoperation]`_`f hätte, der Prozessor aber keine `F33f`_`[FPU`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Gleitkommaeinheit]`_`f besitzt – ein weiterer Übersetzungsschritt fügt dann Code ein, der diese Befehle mit den vorhandenen Ganzzahlbefehlen simuliert.
>>Static Single Assignment
Eine spezielle Klasse von Zwischencode ist die `!Static-Single-Assignment`!-Darstellung (auch `*Static Single Assignment Form`*, abgekürzt `*SSA`*). Sie zeichnet sich dadurch aus, dass im Zwischencode jeder `F33f`_`[Variablen`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Variable_(Programmierung)]`_`f nur einmal ein Wert `F33f`_`[zugewiesen`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Zuweisung]`_`f wird. Dadurch werden `F33f`_`[Datenabhängigkeiten`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Datenabhängigkeit]`_`f zwischen Befehlen explizit dargestellt, was für viele Optimierungen von Vorteil ist. Die SSA-Darstellung ist im Allgemeinen nur mit Hilfe von `F33f`_`[Phi-Funktionen`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Phi-Funktion_(Compilerbau)]`_`f möglich. Die Quellprogramme vieler Programmiersprachen lassen sich ohne größeren Aufwand in eine SSA-Darstellung transformieren. Viele moderne Compiler – darunter die Compiler der `F33f`_`[GNU Compiler Collection`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=GNU_Compiler_Collection]`_`f – verwenden daher SSA-basierten Zwischencode. Beispiel:
Originalcode:
`B100`F9d9y:= 1`f`b
`B100`F9d9y:= 2`f`b
`B100`F9d9x:= y`f`b
Zwischencode:
`B100`F9d9y1 := 1`f`b
`B100`F9d9y2 := 2`f`b
`B100`F9d9x1 := y2`f`b
>>Sprachen
Obwohl C nicht als Zwischencode gedacht war, wurde es eine populäre Zwischensprache, da es eine Abstraktion von `F33f`_`[Assembler`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Assemblersprache]`_`f und wegen seiner allgemeinen Verfügbarkeit auch die De-facto-Systemsprache von `F33f`_`[unixartigen`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Unixoides_System]`_`f und anderen `F33f`_`[Betriebssystemen`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Betriebssystem]`_`f ist. So wird C u. a. von folgenden Sprachen als Zwischencode benutzt: `F33f`_`[Eiffel`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Eiffel_(Programmiersprache)]`_`f, `F33f`_`[Sather`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Sather]`_`f, `F33f`_`[Esterel`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Esterel_(Programmiersprache)]`_`f, einige `F33f`_`[Lisp`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Lisp]`_`f-Dialekte (Lush, `F33f`_`[Gambit`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Scheme]`_`f), `F33f`_`[Haskell`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Haskell_(Programmiersprache)]`_`f (`F33f`_`[Glasgow Haskell Compiler`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Haskell_(Programmiersprache)]`_`f), `F33f`_`[Squeaks`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Squeak]`_`f Smalltalk-subset Slang, `F33f`_`[Cython`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Cython]`_`f, `F33f`_`[Seed7`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Seed7]`_`f, `F33f`_`[Vala`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Vala_(Programmiersprache)]`_`f. Einige Varianten von C wurden entwickelt, um aus C eine bessere portable `F33f`_`[Assemblersprache`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Assemblersprache]`_`f zu machen: `F33f`_`[C−−`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=C−−]`_`f und C Intermediate Language.
`F33f`_`[Microsofts`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Microsoft]`_`f `F33f`_`[Common Intermediate Language`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Common_Intermediate_Language]`_`f ist ein Zwischencode, der von allen `F33f`_`[.Net-Framework`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=.Net-Framework]`_`f-Compilern benutzt wird, bevor er statisch oder dynamisch weiter zu `F33f`_`[Maschinencode`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Maschinencode]`_`f kompiliert wird.
Die `F33f`_`[GNU Compiler Collection`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=GNU_Compiler_Collection]`_`f (GCC) benutzt intern mehrere Zwischencodes, um die Portabilität und `F33f`_`[Cross-Compilation`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Cross-Compiler]`_`f zu unterstützen. Zu diesen Sprachen gehören
• die historische `F33f`_`[Register Transfer Language`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=GNU_Compiler_Collection]`_`f (RTL)
• das sprachunabhängige Baumformat `F33f`_`[GENERIC`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=GNU_Compiler_Collection]`_`f
• das `F33f`_`[SSA`#static-single-assignment]`_`f-basierte `F33f`_`[GIMPLE`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=GNU_Compiler_Collection]`_`f.
Die meisten Zwischencodesprachen wurden für `F33f`_`[statisch typisierte`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Statische_Typisierung]`_`f Sprachen entwickelt. Im Unterschied dazu wurde `F33f`_`[Parrot`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Parrot]`_`f zur Unterstützung der `F33f`_`[dynamisch typisierten`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Dynamische_Typisierung]`_`f Sprachen `F33f`_`[Perl`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Perl_(Programmiersprache)]`_`f und `F33f`_`[Python`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Python_(Programmiersprache)]`_`f entwickelt.
>>Siehe auch
• `F33f`_`[Warren’s Abstract Machine`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Warren’s_Abstract_Machine]`_`f, eine virtuelle Maschine für Prolog
• `F33f`_`[Virtualisierung`:/page/entry.mu`zim=wikipedia_de_all_nopic_2026-01.zim|entry_path=Virtualisierung_(Informatik)]`_`f
`c`F0af`_`[↑ Back to top`#top]`_`f`a